package com.sz.framework.listener;

import com.sz.framework.config.SzConfig;

import java.util.ArrayList;
import java.util.List;

/**
 * 事件监听器管理中心，提供监听器注册与事件发布的功能
 *
 * @author: yxl
 * 2025-07-22
 */
public class SzListenerManager {

    private static List<SzListener> listeners = new ArrayList<>();

    static {
        // 默认增加控制台打印日志的监听器
        listeners.add(new SzListenerLog());
    }

    /**
     * 获取已注册的所有监听器
     *
     * @return /
     */
    public static List<SzListener> getListeners() {
        return listeners;
    }

    /**
     * 重置监听器
     *
     * @param listeners /
     */
    public static void setListeners(List<SzListener> listeners) {
        if (listeners == null || listeners.size() == 0) {
            listeners = new ArrayList<>();
            listeners.add(new SzListenerLog());
        } else {
            long logListener = listeners.stream().filter(listener -> listener instanceof SzListenerLog).count();
            if (logListener == 0) {
                listeners.add(new SzListenerLog());
            }
        }
        SzListenerManager.listeners = listeners;
    }

    /**
     * 注册一个监听器
     *
     * @param listener /
     */
    public static void registerListener(SzListener listener) {
        if (listener != null) {
            listeners.add(listener);
        }
    }

    /**
     * 注册一组监听器
     *
     * @param listeners /
     */
    public static void registerListeners(List<SzListener> listeners) {
        if (listeners != null && listeners.size() > 0) {
            for (SzListener listener : listeners) {
                registerListener(listener);
            }
        }
    }

    /**
     * 移除一个监听器
     *
     * @param listener /
     */
    public static void unregisterListener(SzListener listener) {
        if (listener != null) {
            listeners.remove(listener);
        }
    }

    /**
     * 移除指定类型的监听器
     *
     * @param clazz /
     */
    public static void unregisterListener(Class<? extends SzListener> clazz) {
        ArrayList<SzListener> listenersCopy = new ArrayList<>(listeners);
        for (SzListener listener : listenersCopy) {
            if (clazz.isAssignableFrom(listener.getClass())) {
                listeners.remove(listener);
            }
        }
    }

    /**
     * 清空所有已注册的监听器 (保留日志监听器)
     */
    public static void clearListener() {
        listeners.clear();
        listeners.add(new SzListenerLog());
    }

    /**
     * 判断是否已经注册了指定监听器
     *
     * @param listener /
     * @return /
     */
    public static boolean hasListener(SzListener listener) {
        return listeners.contains(listener);
    }

    /**
     * 判断是否已经注册了指定类型的监听器
     *
     * @param clazz /
     * @return /
     */
    public static boolean hasListener(Class<? extends SzListener> clazz) {
        for (SzListener listener : listeners) {
            if (clazz.isAssignableFrom(listener.getClass())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 事件发布：有新的全局配置载入到框架中
     *
     * @param config /
     */
    public static void afterSetConfig(SzConfig config) {
        for (SzListener listener : listeners) {
            listener.afterSetConfig(config);
        }
    }


}
